외부 정찰 / 정보 수집

정보 수집과 외부 정찰이란?

정보 수집 / 외부 정찰은 외부 공격자의 입장에서 접근 가능한 자산, 데이터, 정보를 수집해 이후 초기 침투 단계에서 사용될 수 있도록 정제하는 단계이다.

용어 정리

  • 자산 : DMZ 서버, 클라우드 VM(EC2, Azure VM, GCP computer), 클라우드 서비스(S3, Azure Blob, Lambda), 퍼블릭 API, SaaS 서비스
  • 데이터 : 소스 코드, 설정 파일, 내부 문서
  • 정보 : 임직원 이메일, 사용 기술 스택, 인수 / 합병 정보, 조직 구조

분산 정보 수집, 분산 스캐닝

분산 정보 스캐닝 혹은 분산 스캐닝은 다수의 IP와 프로필을 활용해 정보 수집을 하는 방식이다.

주로 클라우드 인프라를 통해서 수행한다.

외부 정찰 방법론

1. 공격 대상 프로파일링

최대한 넓은 시각에서 프로파일링을 한다.

예시

  • 대상의 이름
  • 해외법인의 개수
  • 해외법인의 이름
  • 자회사/협력사들의 이름
  • 규모, 위치 업계 현황
  • 조직 구조 파악

2. 살아있는 호스트 확인

서브도메인 및 IP 주소 확인을 통해 공격 표면을 정리한다.

  • 추천 툴 : BBOT, Amass, theHarvester, subfinder, dnsx

위 도구를 사용한 다음 서브 도메인들을 DNS Resolve 하고 resolve 된 IP 주소를 종류별로 분류한다.

IP에 따라 Saas, 클라우드 호스트, DMZ, CDN, 등 IP 주소에 따라 다양한 분류가 가능하다.

  • 추천 툴 : IP2Provider

2. Apex Domain 확인

대상의 DNS 최상단의 Apex 도메인을 확인한다.

그 이유는 다른 기업/도메인을 공격하는 불상사를 막기 위해 해야한다.

3. 살아있는 호스트 확인

현재 살아 있는 포트 번호를 확인하면서, 열려 있는 포트 중에서 공격이 가능한 포트가 있는지 확인한다.

  • 추천 툴 : Ax Framework

확인 추천 포트

  • 21,22,23,25,465,587,53,80,443,110,111,135,139,445,143,993,389,636,1080,1098,1099,1050,2049,2375,2376,3128,3389,3306,5000,5601,5984,6984,5985,5986,6379,8080,8089,9200,9042,27017,27018,8443,9443,8000,9000

4. 중요 SaaS 확인

공격 표면을 확실히 알아놓기 위해 중요 SaaS를 확인한다.

  1. DNS 정보 수집 중 TXT 레코드 확인
  2. 대부분의 Apex 도메인 혹은 www 도메인에 TXT 레코드로 본인들이 활용하고 있는 SaaS와 관련된 TXT를 넣
nslookup -type=TXT tesla.com 

실습

일단 bbot을 활용해서 해당 도메인을 향해 서브 도메인 정보 수집을 진행합니다.

$bbot -t raccoontech.work -p subdomain-enum -rf passive -ef portscan
 
...
 
[SCAN]                  stricken_arwen (SCAN:d34db4723e63824fdfd4b382886d347b527d6ff5)  TARGET
[DNS_NAME]              raccoontech.work        TARGET  (domain, in-scope, ns-record, soa-record, target)
[ORG_STUB]              raccoontech     speculate
[DNS_NAME]              darwin.ns.cloudflare.com        SOA     (a-record, aaaa-record, affiliate, cloud, cloud-google, cloudflare-domain, cloudflare-ip, distance-1, google-ip, subdomain, waf, waf-cloudflare)
[DNS_NAME]              darwin.ns.cloudflare.com        NS      (a-record, aaaa-record, affiliate, cloud, cloud-google, cloudflare-domain, cloudflare-ip, distance-1, google-ip, subdomain, waf, waf-cloudflare)
[DNS_NAME]              walk.ns.cloudflare.com  NS      (a-record, aaaa-record, affiliate, cloud, cloud-google, cloudflare-domain, cloudflare-ip, distance-1, google-ip, subdomain, waf, waf-cloudflare)
[INFO] anubisdb: Error parsing results for query "raccoontech.work" (status code 301)
[DNS_NAME]              stg-ap2-api04-monitor.raccoontech.work  certspotter     (a-record, amazon-ip, cdn, cdn-cloudfront, cloud, cloud-amazon, cloudfront-ip, in-scope, subdomain)
[DNS_NAME]              raccoontech.work        speculate       (domain, in-scope, ns-record, soa-record)
[INFO] leakix: Error parsing results for query "raccoontech.work" (status code 401)
[DNS_NAME]              stg-ap2-api04-monitor.raccoontech.work  dnsdumpster     (a-record, amazon-ip, cdn, cdn-cloudfront, cloud, cloud-amazon, cloudfront-ip, in-scope, subdomain)
[ASN]                   {"asn": "16509", "country": "US", "description": "Amazon.com, Inc.", "name": "AMAZON-02", "subnet": "13.208.0.0/16"}    asn

stg-ap2-api04-monitor.raccoontech.work 해당 스테이징 API 모니터링 서버를 볼 수 있다.

스테이징 서버와 관련된 호스트들이 인터넷에 노출 되어 있는 것은 현업에서 많이 마주치는 상황이다.

nslookup stg-ap2-api04-monitor.raccoontech.work

nslookup 명령어를 통해서 해당 모니터 서버의 IP가 13.208.47.21이라는 사실을 알 수 있었습니다.

cd /opt
git clone <https://github.com/oldrho/ip2provider.git>
cd ./ip2provider
python3 -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt
 
python3 ip2provider.py 13.208.47.21

IP2Provider를 통해서 해당 AWS 가 어디 리전에 있는지 알 수 있다.

결과 AWS ap-northeast-3 resion에 있는 서버라는 것을 알 수 있었습니ㅏㄷ.

nmap을 통해서 분산 스캐닝을 하고 현재 열려 있는 포트 번호를 알 수 있게 된다.

nmap -p 3000 -Pn -n --open <Domain IP>

이 상태에서 바로 해당 서버에 접속할 경우 공격자 IP가 외부에 노출될 수 있으므로, operator 서버의 IP를 가지고 dynamic port forwarding을 진행하여 숨기겠습니다.

curl https://ipinfo.io/ip
ssh -i ~/.ssh/redteamlite ubuntu@<ip> -D. 8081

또한 proxy 서버 설정을 통해서 웹 브라우저를 IP를 오퍼레이터 서버로 만들수 있다.

설정 > Proxy 검색 > 네트워크 Setting Proxy에서 Manual Proxy configuration - SOCKS Host를 로컬호스트로 포트는 위 SSH 다이나믹 포트 포워딩때 사용한 포트를 입력한다.